package com.example.stuwork.service;

import com.example.stuwork.pojo.ClassCourse;

import java.util.List;

/**
 * 班级课程关联服务接口
 */
public interface ClassCourseService {
    
    /**
     * 根据课程ID查询关联的班级课程信息
     *
     * @param courseId 课程ID
     * @return 班级课程关联列表
     */
    List<ClassCourse> findByCourseId(String courseId);
    
    /**
     * 根据班级ID查询关联的班级课程信息
     *
     * @param classId 班级ID
     * @return 班级课程关联列表
     */
    List<ClassCourse> findByClassId(Long classId);
    
    /**
     * 根据课程ID和班级ID查询关联信息
     *
     * @param courseId 课程ID
     * @param classId 班级ID
     * @return 班级课程关联信息
     */
    ClassCourse findByCourseIdAndClassId(String courseId, Long classId);
    
    /**
     * 根据教师ID查询关联的班级课程信息
     *
     * @param teacherId 教师ID
     * @return 班级课程关联列表
     */
    List<ClassCourse> findByTeacherId(String teacherId);
    
    /**
     * 根据学期获取班级课程信息
     *
     * @param term 学期
     * @return 班级课程关联列表
     */
    List<ClassCourse> findByTerm(String term);
    
    /**
     * 新增班级课程关联
     *
     * @param classCourse 班级课程关联信息
     * @return 是否成功
     */
    boolean addClassCourse(ClassCourse classCourse);
    
    /**
     * 批量添加班级课程关联
     *
     * @param courseId  课程ID
     * @param classIds  班级ID列表
     * @param teacherId 教师ID
     * @param term      学期
     * @return 是否成功
     */
    boolean assignClassesToCourse(String courseId, List<Long> classIds, String teacherId, String term);
    
    /**
     * 更新班级课程关联信息
     *
     * @param classCourse 班级课程关联信息
     * @return 是否成功
     */
    boolean updateClassCourse(ClassCourse classCourse);
    
    /**
     * 更新课程状态
     *
     * @param courseId 课程ID
     * @param classId  班级ID
     * @param status   新状态
     * @return 是否成功
     */
    boolean updateStatus(String courseId, Long classId, String status);
    
    /**
     * 删除班级课程关联
     *
     * @param courseId 课程ID
     * @param classId  班级ID
     * @return 是否成功
     */
    boolean deleteClassCourse(String courseId, Long classId);
    
    /**
     * 根据课程ID删除所有关联
     *
     * @param courseId 课程ID
     * @return 是否成功
     */
    boolean deleteClassCourseByCourseId(String courseId);
    
    /**
     * 根据班级ID删除所有关联
     *
     * @param classId 班级ID
     * @return 是否成功
     */
    boolean deleteClassCourseByClassId(Long classId);
    
    /**
     * 检查班级课程关联是否存在
     *
     * @param courseId 课程ID
     * @param classId  班级ID
     * @return 是否存在
     */
    boolean exists(String courseId, Long classId);
    
    /**
     * 获取未分配给指定课程的班级ID列表
     *
     * @param courseId 课程ID
     * @return 未分配班级ID列表
     */
    List<Long> getClassIdsNotInCourse(String courseId);
    
    /**
     * 获取指定课程关联的班级ID列表
     *
     * @param courseId 课程ID
     * @return 班级ID列表
     */
    List<Long> getClassIdsByCourseId(String courseId);

    /**
     * 获取班级的所有课程
     * @param classId 班级ID
     * @return 课程列表
     */
    List<ClassCourse> getCoursesByClassId(Long classId);

    /**
     * 分配课程到班级
     * @param classCourse 班级课程关联信息
     * @return 是否成功
     */
    boolean assignCourseToClass(ClassCourse classCourse);

    /**
     * 从班级移除课程
     * @param classId 班级ID
     * @param courseId 课程ID
     * @return 是否成功
     */
    boolean removeCourseFromClass(Long classId, String courseId);
}